當多個行程並行(concurrent)處理共享的資料時,共享資料同時被不同 Process / threads 存取,因為執行順序的不確定性,很容易發生資料不一致(data inconsistency)的狀況,所以需要額外的機制來確保程式的正確性,也就是同步(Synchronization)。
每當一個新的 item 被加入緩衝區時,counter 便被加 1,而每當從我們緩衝區移去一個 item 時,counter 便被減 1。
當這兩個行程並行執行時可能不會正確地工作,假設現在 counter = 5:
counter++
可用下列機器語言來實現register1 = counter
register1 = register1 + 1
counter = register1
counter--
可用下列機器語言來實現register2 = counter
register2 = register2 - 1
counter = register2
register1、register2 是一個區域性 CPU 的暫存器。
在上圖中我們得到 counter == 4,紀錄有四個填滿的緩衝區而實際上卻有五個填滿的緩衝區。如果先執行 T5 再執行 T4,我們將得到 counter == 6。像這種數個行程同時存取和處理相同資料的情況,而且執行的結果取決於存取時的特殊順序,就叫競爭情況(race condition)。
參考: